选择

  有时我们只是想从一个名字空间里选用几个名字。我们可以做到这一点,只要写出一个仅仅包含我们想要的声明的名字空间。例如,我们可以声明一个His_string版本,它只提供了String本身和拼接运算符:

    namespace His_string {        // 只有His_string的一部分
        class String { /* ... */ };
        String operator+(const String&, const String&);
        String operator+(const String&, const char*)
    }

然而,除非我就是His_string的设计师或维护者,否则这一做法很快就会陷入混乱。任何对“真正的”His_string定义的修改都不会在这个声明中反映出来。通过使用声明来做,可以使从名字空间里选择一些特征的事变得更加明确:

    namespace My_string {
        using His_string::String;
        using His_string::operator+;        // 使用His_string的任何+
    };

使用声明将具有所指定的名字的每个声明都带入作用域。特别地,通过一个使用声明就可以将一个重载函数的所有变形都带进来。

  这种方式下,如果His_string的维护者给String增加了一个成员函数,或者给拼接运算符增加了一个重载版本,这种修改将自动地变成My_string的用户可用的东西。相反地,如果某个特征被从His_string里删除,或者其界面修改了,对My_string使用的影响也将被编译器检查出来(另见15.2.2节)。

🔚